package algo3c3g3.model.material;

import java.util.*;

/**
 * Provee instancias de materiales segun su nombre.
 */
public abstract class MaterialFactory
{
    private static Map<String, Material> materials = new HashMap<String, Material>();
    
    // Se crean las instancias unicas.
    static
    {
        materials.put(Material.AIR, new Air());
        materials.put(Material.BLACK_HOLE, new BlackHole());
        materials.put(Material.BRIDGE, new Bridge());
        materials.put(Material.FIRE, new Fire());
        materials.put(Material.GROUND, new Ground());
        materials.put(Material.ICE, new Ice());
        materials.put(Material.ROCK, new Rock());
        materials.put(Material.INVISIBLE_BLOCK, new InvisibleBlock());
    }
    
    /**
     * Devuelve una instancia del material indicado.
     * @param type Tipo de material
     * @return Instancia del material correspondiente
     */
    public static Material getInstance(String type)
    {
        // Se reutilizan las mismas instancias porque no es necesario crear mas de una
        // para un mismo material.
        Material m = materials.get(type);
        
        if(m == null)
            throw new RuntimeException("El material " + type + " no es valido.");
        
        return m;
    }
}
